<?php
namespace jm\wechat;
use jm\wechat\common\WeChatCommon;
use think\Db;
use think\Config;
/**
 * 提现管理
 * jm\WeChat\WeChatWithdraw
 * @icon fa fa-circle-o
 */
class WeChatRefund 
{
        public $appid = 'wxbf9588a6bd5e6d59';
     	public $mch_id = '1602988750';
     	public $key = '2e8baf653d4647649c07169ca11b0527';
     	public $apiclient_cert = './wxpay/apiclient_cert.pem';
     	public $apiclient_key = './wxpay/apiclient_key.pem'; 
          //私有化构造函数，防止外界实例化对象
      public function __construct($data)
      {
        $this->appid=isset($data["appid"])&&!empty($data["appid"])?$data["appid"]:$this->appid;
        $this->mch_id=isset($data["mch_id"])&&!empty($data["mch_id"])?$data["mch_id"]:$this->mch_id;
        $this->key=isset($data["key"])&&!empty($data["key"])?$data["key"]:$this->key;
        $this->apiclient_cert=isset($data["apiclient_cert"])&&!empty($data["apiclient_cert"])?$data["apiclient_cert"]:$this->apiclient_cert;
        $this->apiclient_key=isset($data["apiclient_key"])&&!empty($data["apiclient_key"])?$data["apiclient_key"]:$this->apiclient_key;
      }
      public function Refund($total_fee,$refund_fee,$order_sn,$out_refund_no)
    {
//   $order_sn  支付订单号
   
 
        if ($refund_fee){ 
      
        $key = $this->key; 
        $common=new  WeChatCommon($key);//调用公共方法
            //统一下单退款参数构造
            $unifiedorder = array(
                'appid' => $this->appid,
                'mch_id' => $this->mch_id,
                'nonce_str' => $common->getNonceStr(),
                'out_trade_no' => $order_sn, //商户订单号	商户系统内部订单号，要求32个字符内，只能是数字、大小写字母_-|*@ ，且在同一个商户号下唯一。
                'out_refund_no' => $out_refund_no, //商户退款单号	商户系统内部的退款单号，商户系统内部唯一，只能是数字、大小写字母_-|*@ ，同一退款单号多次请求只退一笔。
                'total_fee' => intval($total_fee*100), //订单金额
                'refund_fee' => intval(floatval($refund_fee*100)), //退款金额	
            );
//          return self::getNonceStr().'---$out_trade_no---'.$out_trade_no.'---$out_refund_no---'.$out_refund_no.'---$total_fee---'.$total_fee.'---$refund_fee---'.$refund_fee;
            $unifiedorder['sign'] =  $common->makeSign($unifiedorder,$key); 
            // return $unifiedorder['sign'];
            //请求数据
            $xmldata =  $common->array2xml($unifiedorder);
         
            $opUrl = "https://api.mch.weixin.qq.com/secapi/pay/refund";
            // 此方法是为了进行 微信退款操作的 专属定制哦
            $res = self::curl_post_ssl_refund($opUrl, $xmldata);
            if (!$res) {
               return array('status' => 0, 'result' => 'fail', 'errmsg' => "Can't connect the server");
     
            }
            $content =  $common->xml2array($res);
           
            if (strval($content['result_code']) == 'FAIL') { 
                   return array('status' => 0, 'result' => 'fail', 'errmsg' => $content['err_code_des']);
     
            }
            if (strval($content['return_code']) == 'FAIL') {
                
                   return array('status' => 0, 'result' => 'fail', 'errmsg' => $content['return_msg']);
          
            }
            return array('status' => 1, 'result' => 'fail', 'errmsg' => "退款成功!");
        }else{
            return array('status' => 0, 'result' => 'fail', 'errmsg' => "不符合退款订单!");
     
        }
    }
    
    //---------------------------------------------------------------用到的函数------------------------------------------------------------
 
    /**
     * 此方法是为了进行 微信退款操作的 专属定制哦
     * (嘁，其实就是照搬了 人家官方的PHP Demo代码咯)
     * TODO 尤其注意代码中涉及到的 "证书使用方式（二选一）"
     * TODO 证书的路径要求为 服务器中的绝对路径[我的服务器为 CentOS6.5]
     * TODO 证书是 在微信支付开发文档中有所提及，可自行获取保存
     */
    protected function curl_post_ssl_refund($url, $vars, $second=30,$aHeader=array())
    {
        $ch = curl_init();
        //超时时间
        curl_setopt($ch,CURLOPT_TIMEOUT,$second);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
        //这里设置代理，如果有的话
        //curl_setopt($ch,CURLOPT_PROXY, '10.206.30.98');
        //curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
        curl_setopt($ch,CURLOPT_URL,$url);
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
        //TODO 以下两种方式需选择一种
        /*------- --第一种方法，cert 与 key 分别属于两个.pem文件--------------------------------*/
        //默认格式为PEM，可以注释
        //curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
        curl_setopt($ch,CURLOPT_SSLCERT,'./wxzs/apiclient_cert.pem');
        //默认格式为PEM，可以注释
        //curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
        curl_setopt($ch,CURLOPT_SSLKEY,'./wxzs/apiclient_key.pem');
        /**
         * 补充 当找不到ca根证书的时候还需要rootca.pem文件
         * TODO 注意，微信给出的压缩包中，有提示信息：
         *      由于绝大部分操作系统已内置了微信支付服务器证书的根CA证书,
         *      2018年3月6日后, 不再提供CA证书文件（rootca.pem）下载
         */
        //curl_setopt($ch, CURLOPT_CAINFO,'/mnt/www/Public/certxxxxxxxxxxxxxxxxxxxx755/rootca.pem');
 
        /*----------第二种方式，两个文件合成一个.pem文件----------------------------------------*/
        //curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/all.pem');
 
        if( count($aHeader) >= 1 ){
            curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
        }
 
        curl_setopt($ch,CURLOPT_POST, 1);
        curl_setopt($ch,CURLOPT_POSTFIELDS,$vars);
        $data = curl_exec($ch);
        if($data){
            curl_close($ch);
            return $data;
        }
        else {
            $error = curl_errno($ch);
            //echo "call faild, errorCode:$error\n";
            curl_close($ch);
            return false;
        }
    }
 
     
 
    
}

 